package com.sztx.pay.center.core.service;

import java.util.Date;
import java.util.List;

import com.sztx.pay.center.common.util.Constance.TradeOrderType;
import com.sztx.pay.center.common.util.Constance.UserActType;
import com.sztx.pay.center.core.service.bean.BatchActTransferReq;
import com.sztx.pay.center.core.service.bean.BatchActTransferRsp;
import com.sztx.pay.center.core.service.bean.CreateActRep;
import com.sztx.pay.center.core.service.bean.CreateActReq;
import com.sztx.pay.center.dataaccess.domain.UserActDO;

public interface ActService {
	
	/**
	 * 创建账户
	 * 根据用户id和用户类别创建用户账号
	 * @param userId     用户Id
	 * @param userType   用户类别
	 * @return
	 * @author xiaosc
	 * @date 2016年7月12日 下午5:10:17 
	 */
	List<CreateActRep> createUserAct(String userId, int userType);
	
	
	
	/**
	 * 创建账户
	 * 根据用户id和账户类别创建用户账号
	 * @param userId
	 * @param userType
	 * @param actType
	 * @return
	 * @author xiaosc
	 * @date 2016年7月12日 下午5:12:22 
	 */
	String createAct(String userId, int userType, int actType);

	
	
	/**
	 * 创建账号
	 * <功能详细描述>
	 * @param actReq
	 * @author xiaosc
	 * @date 2016年7月4日 下午2:05:31 
	 * @see [类、类#方法、类#成员]
	 */
	List<CreateActRep> createUserAct(List<CreateActReq> actReq);
    
    
    /**
     * 注销账户
     * 
     * @param actNo
     *            账户号
     */
    void closeAct(String actNo, String operatorUser, String attach);
    
    /**
     * 冻结账户
     * 
     * @param actNo
     *            账户号
     */
    void freezeAct(String actNo, String operatorUser, String attach);

    /**
     * 解冻账户
     * 
     * @param actNo
     *            账户号
     */
    void unfreezeAct(String actNo, String operatorUser, String attach);
    
    
    /**
     * 使账户余额增加
     * <功能详细描述>
     * @param actNo           账号
     * @param amount          增加金额
     * @param originOrderNo   原始订单号
     * @param payFlowId       支付订单号
     * @param payTime         支付时间
     * @param tradeType       交易类别
     * @param tradeMsg        交易信息
     * @return
     * @author xiaosc
     * @date 2016年7月21日 下午3:55:16 
     */
    Date plusMoney(String actNo, long amount, String originOrderNo,
            String payFlowId, Date payTime, TradeOrderType tradeType,  String tradeMsg, String businessType);

//    Date plusMoney(String actNo, String bankActNo, long amount, String payType,
//            String originOrderNo, String payFlowId, String tradeMsg);
    
  /**
   * 使账户余额减少
   * <功能详细描述>
   * @param actNo           账号
   * @param amount          减少金额
   * @param originOrderNo   原始订单号
   * @param payFlowId       支付订单号
   * @param payTime         支付时间
   * @param tradeType       交易类别
   * @param tradeMsg        交易信息
   * @return
   * @author xiaosc
   * @date 2016年7月21日 下午3:55:16 
   */
    Date subMoney(String actNo, long amount, String originOrderNo,
            String payFlowId, Date payTime, TradeOrderType tradeType,  String tradeMsg, String businessType);
    
    /**
     * 冻结账户金额
     * <功能详细描述>
     * @param actNo          账号
     * @param amount         冻结金额
     * @param originOrderNo  原始订单号
     * @param payFlowId      支付订单号
     * @param payTime        支付时间
     * @param tradeType      交易类型
     * @param tradeMsg       交易信息
     * @param updateUser     操作人
     * @return
     * @author xiaosc
     * @date 2016年7月21日 下午3:52:35 
     */
    Date freezeMoney(String actNo, long amount,  String originOrderNo,
            String payFlowId, Date payTime, TradeOrderType tradeType,  String tradeMsg, String updateUser, String businessType);
    
  
    /**
     * 解冻账户金额
     * <功能详细描述>
     * @param actNo          账号
     * @param amount         解冻金额
     * @param originOrderNo  原始订单号
     * @param payFlowId      支付订单号
     * @param payTime        支付时间
     * @param tradeType      交易类型
     * @param tradeMsg       交易信息
     * @param updateUser     操作人
     * @return
     * @author xiaosc
     * @date 2016年7月21日 下午3:52:35 
     */
    Date unfreezeMoney(String actNo, long amount, String originOrderNo,
            String payFlowId, Date payTime, TradeOrderType tradeType,  String tradeMsg, String updateUser, String businessType);
    
    
    /**
     * 转账
     * <功能详细描述>
     * @param srcActNo   转出账号
     * @param desActNo   转入账号
     * @param amount     转账金额
     * @param originOrderNo  原始订单号
     * @param payFlowId      支付订单号
     * @param tradeType      交易类别
     * @param tradeMsg       交易信息
     * @return
     * @author xiaosc
     * @date 2016年7月21日 下午3:50:39 
     */
    Date transferAct(String srcActNo, String desActNo, long amount, String originOrderNo,
            String payFlowId, TradeOrderType tradeType,  String tradeMsg, String businessType);
    
    /**
     * 账户批量内转
     * <功能详细描述>
     * @param list
     * @return
     * @author xiaosc
     * @date 2016年7月21日 下午3:42:23 
     */
    public List<BatchActTransferRsp> bacthTransferActs(final List<BatchActTransferReq> list);
   
    /**
     * 根据用户id查询用户账户
     * <功能详细描述>
     * @param userId
     * @return
     * @author xiaosc
     * @date 2016年7月21日 下午3:43:45 
     */
    public List<UserActDO> findByUserId(String userId);
    
    /**
     * 根据账号列表查询账户信息
     * <功能详细描述>
     * @param actNoList
     * @return
     * @author xiaosc
     * @date 2016年7月21日 下午3:45:08 
     */
    public List<UserActDO> findByActNoList(List<String> actNoList);
    
    /**
     * 根据用户列表查询账户信息
     * <功能详细描述>
     * @param userList
     * @return
     * @author xiaosc
     * @date 2016年7月21日 下午4:25:48 
     */
    public List<UserActDO> findByUserList(List<String> userList);    
    
    /**
     * 根据用户id和账户类别查询账户信息
     * <br>userType和actLevel无效
     * @param userId
     * @param userActType
     * @return
     * @author xiaosc
     * @date 2016年7月21日 下午3:45:57 
     */
    public UserActDO findUserAct(String userId, UserActType userActType);
    
    /**
     * 根据用户id和账户类别查询账户信息
     * <br>userType和actLevel有效
     * @param userId
     * @param userActType
     * @return
     */
    public UserActDO findActInfo(String userId, UserActType userActType);

    /**
     * 根据用户id和账户类别查询账户信息
     * <br>userType和actLevel有效
     * <br>账户不存在或状态为非正常则抛出异常
     * @param userId       用户id
     * @param userActType  账户类别
     * @param isPayer      是否为付款方
     * @return
     */
    public UserActDO findValidActInfo(String userId, UserActType userActType, boolean isPayer);
    
    /**
     * 批量查询用户信息
     * @param usersId
     * @param userActType
     * @return
     */
    public List<UserActDO> findUsersAct(List<String> userList, UserActType userActType);
    
    /**
     * 根据账号查询账户信息
     * <功能详细描述>
     * @param actNo
     * @return
     * @author xiaosc
     * @date 2016年7月21日 下午3:46:23 
     */
    public UserActDO findUserAct(String actNo);
    
    /**
     * 更新账户信息
     * @param userId
     * @param remark
     * @param actState
     * @param updateUser
     * @param actType
     */
    public void updateUserAct(String userId, String remark, int actState,String updateUser, int actType);

    
}
